package sf_time

import (
	"fmt"
	"time"
)

// 节假日列表（可根据需要扩展）
var holidays = map[string]bool{
	"2026-01-01": true, // 元旦
	"2026-02-17": true, // 春节
	"2026-02-18": true, // 春节
	"2026-02-19": true, // 春节
	"2026-02-20": true, // 春节
	"2026-02-21": true, // 春节
	"2026-02-22": true, // 春节
	"2026-02-23": true, // 春节
	"2026-04-05": true, // 清明节
	"2026-05-01": true, // 劳动节
	"2026-05-02": true, // 劳动节
	"2026-05-03": true, // 劳动节
	"2026-05-04": true, // 劳动节
	"2026-05-05": true, // 劳动节
	"2026-06-19": true, // 端午节
	"2026-09-25": true, // 中秋节
	"2026-10-01": true, // 国庆节
	"2026-10-02": true, // 国庆节
	"2026-10-03": true, // 国庆节
	"2026-10-04": true, // 国庆节
	"2026-10-05": true, // 国庆节
	"2026-10-06": true, // 国庆节
	"2026-10-07": true, // 国庆节
	// 添加更多节假日...
}

// IsWorkday 检查给定时间戳对应的日期是否是工作日
func IsWorkday(timestamp int64) bool {
	t := time.Unix(timestamp, 0)

	// 检查是否是周末
	if t.Weekday() == time.Saturday || t.Weekday() == time.Sunday {
		return false
	}

	// 检查是否是节假日
	dateStr := t.Format("2006-01-02")
	if holidays[dateStr] {
		return false
	}

	return true
}

// AddWorkdaysTimestamp 计算从给定时间戳开始的第N个工作日后的时间戳
// isMilli 表示输入的时间戳是否是毫秒级
func AddWorkdaysTimestamp(startTimestamp int64, n int, isMilli bool) int64 {
	var t time.Time
	if isMilli {
		t = time.Unix(startTimestamp/1000, (startTimestamp%1000)*int64(time.Millisecond))
	} else {
		t = time.Unix(startTimestamp, 0)
	}

	daysAdded := 0
	oneDay := 24 * time.Hour

	for daysAdded < n {
		t = t.Add(oneDay) // 增加一天
		if IsWorkday(t.Unix()) {
			daysAdded++
		}
	}

	if isMilli {
		return t.UnixNano() / int64(time.Millisecond)
	}
	return t.Unix()
}

func main() {
	// 获取当前时间戳（秒级）
	now := time.Now().Unix()
	fmt.Printf("当前时间戳: %d\n", now)

	// 计算5个工作日后的时间戳（秒级）
	fiveWorkdaysLater := AddWorkdaysTimestamp(now, 5, false)
	fmt.Printf("5个工作日后的时间戳(秒): %d\n", fiveWorkdaysLater)
	fmt.Printf("对应时间: %s\n", time.Unix(fiveWorkdaysLater, 0).Format("2006-01-02 15:04:05"))

	// 计算10个工作日后的时间戳（秒级）
	tenWorkdaysLater := AddWorkdaysTimestamp(now, 10, false)
	fmt.Printf("10个工作日后的时间戳(秒): %d\n", tenWorkdaysLater)
	fmt.Printf("对应时间: %s\n", time.Unix(tenWorkdaysLater, 0).Format("2006-01-02 15:04:05"))

	// 毫秒级时间戳示例
	nowMilli := time.Now().UnixNano() / int64(time.Millisecond)
	fmt.Printf("\n当前毫秒时间戳: %d\n", nowMilli)

	fiveWorkdaysLaterMilli := AddWorkdaysTimestamp(nowMilli, 5, true)
	fmt.Printf("5个工作日后的时间戳(毫秒): %d\n", fiveWorkdaysLaterMilli)
	fmt.Printf("对应时间: %s\n", time.Unix(fiveWorkdaysLaterMilli/1000, 0).Format("2006-01-02 15:04:05.000"))
}
